package jmine.tec.hydra.api;

import java.util.List;

import jmine.tec.hydra.domain.HydraComment;
import jmine.tec.hydra.domain.enumx.HydraActionStatus;
import bancosys.tec.persist.Persistable;
import bancosys.tec.utils.date.Timestamp;

/**
 * Interface de uma HydraAction
 * 
 * @author lundberg
 */
public interface HydraAction extends Persistable {

    /**
     * Executa esta action e retorna uma lista de actions que devem ser executadas em seguida. O HydraAction é responsável por garantir sua
     * execução, desde seu registro inicial até o registro de sucesso ou falha, além da execução da ação em si. Qualquer falha que ocorra
     * deve ser jogada para que o executor da ação trate de acordo.
     * 
     * @param request request
     * @param visitor visitor
     * @return List de HydraAction
     * @throws Throwable caso algo ocorra.
     */
    List<HydraAction> execute(HydraRequest request, HydraRequestVisitor visitor) throws Throwable;

    /**
     * Obtém uma descrição breve da action
     * 
     * @return String
     */
    String getDescription();

    /**
     * Obtém o status da action
     * 
     * @return HydraActionStatus
     */
    HydraActionStatus getStatus();

    /**
     * Retorna o momento de início da execução da ação
     * 
     * @return Timestamp
     */
    Timestamp getActionStart();

    /**
     * Retorna o momento de fim da execução da ação
     * 
     * @return Timestamp
     */
    Timestamp getActionEnd();

    /**
     * Retorna uma lista de comentários feitos durante a execução da action.
     * 
     * @return List de HydraComment
     */
    List<HydraComment> getComments();

    /**
     * Marca a action como solved
     */
    void markSolved();
}
